JavaScriptã®`import.meta`ãªããžã§ã¯ããæ·±ãæãäžãããã©ãŠã¶ããNode.jsããã®ä»å€æ§ãªãã©ãããã©ãŒã ã§ã®ã©ã³ã¿ã€ã ç°å¢æ€åºãšåçèšå®ã«ããããã®æ©èœãæ¢ããŸãã
JavaScriptã®import.metaã«ããç°å¢æ€åºïŒã©ã³ã¿ã€ã ã³ã³ããã¹ãåæ
\n\nçŸä»£ã®JavaScriptéçºã§ã¯ãWebãã©ãŠã¶ãNode.jsã®ãããªãµãŒããŒãµã€ãã©ã³ã¿ã€ã ããšããžé¢æ°ãããã«ã¯çµã¿èŸŒã¿ã·ã¹ãã ãŸã§ãããŸããŸãªç°å¢ã§å®è¡ãããã³ãŒããäœæããããšããããããŸããã©ã³ã¿ã€ã ã³ã³ããã¹ããçè§£ããããšã¯ãã¢ããªã±ãŒã·ã§ã³ã®åäœãé©å¿ãããç°å¢åºæã®èšå®ãèªã¿èŸŒã¿ãã°ã¬ãŒã¹ãã«ãã°ã©ããŒã·ã§ã³æŠç¥ãå®è£
ããããã«äžå¯æ¬ ã§ããECMAScript Modules (ESM) ãšãšãã«å°å
¥ãããimport.metaãªããžã§ã¯ãã¯ãJavaScriptã¢ãžã¥ãŒã«å
ã®ã³ã³ããã¹ãã¡ã¿ããŒã¿ã«ã¢ã¯ã»ã¹ããããã®æšæºåãããä¿¡é Œæ§ã®é«ãæ¹æ³ãæäŸããŸãããã®èšäºã§ã¯ãimport.metaã®æ©èœãæ¢æ±ããããŸããŸãªãã©ãããã©ãŒã ã§ã®ç°å¢æ€åºãšåçèšå®ã«ããããã®äœ¿çšæ³ã玹ä»ããŸãã
import.metaãšã¯ïŒ
\n\nimport.metaã¯ãçŸåšã®ã¢ãžã¥ãŒã«ã«é¢ããã¡ã¿ããŒã¿ãJavaScriptã©ã³ã¿ã€ã ã«ãã£ãŠèªåçã«èšå®ããããªããžã§ã¯ãã§ãããã®ããããã£ã¯ãã¹ãç°å¢ïŒäŸïŒãã©ãŠã¶ãNode.jsïŒã«ãã£ãŠå®çŸ©ãããã¢ãžã¥ãŒã«ã®URLãã¹ã¯ãªããã«æž¡ãããã³ãã³ãã©ã€ã³åŒæ°ãç°å¢åºæã®è©³çްãªã©ã®æ
å ±ãæäŸããŸããã°ããŒãã«å€æ°ãšã¯ç°ãªããimport.metaã¯ã¢ãžã¥ãŒã«ã¹ã³ãŒãã§ãããååã®ç«¶åãé²ããç°ãªãã¢ãžã¥ãŒã«ã·ã¹ãã éã§ã®äžè²«ããåäœãä¿èšŒããŸããæãäžè¬çãªããããã£ã¯import.meta.urlã§ãçŸåšã®ã¢ãžã¥ãŒã«ã®URLãæäŸããŸãã
åºæ¬çãªäœ¿çšæ³ïŒã¢ãžã¥ãŒã«URLãžã®ã¢ã¯ã»ã¹
\n\nimport.metaã®æãåçŽãªãŠãŒã¹ã±ãŒã¹ã¯ãçŸåšã®ã¢ãžã¥ãŒã«ã®URLãååŸããããšã§ããããã¯ãçžå¯Ÿãã¹ã解決ããããã¢ãžã¥ãŒã«ã®å Žæã«é¢é£ãããªãœãŒã¹ãèªã¿èŸŒãã ãããã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã
äŸïŒçžå¯Ÿãã¹ã®è§£æ±º
\n\nåããã£ã¬ã¯ããªã«ããèšå®ãã¡ã€ã«ãèªã¿èŸŒãå¿
èŠãããã¢ãžã¥ãŒã«ãèããŠã¿ãŸããããimport.meta.urlã䜿çšãããšãèšå®ãã¡ã€ã«ãžã®çµ¶å¯Ÿãã¹ãæ§ç¯ã§ããŸãã
\n// my-module.js\nasync function loadConfig() {\n const moduleURL = new URL(import.meta.url);\n const configURL = new URL('./config.json', moduleURL);\n const response = await fetch(configURL);\n const config = await response.json();\n return config;\n}\n\nloadConfig().then(config => {\n console.log('Configuration:', config);\n});\n
ãã®äŸã§ã¯ãmy-module.jsãšåããã£ã¬ã¯ããªã«ããconfig.jsonãã¡ã€ã«ãèªã¿èŸŒãŸããŸããURLã³ã³ã¹ãã©ã¯ã¿ã¯ãçžå¯Ÿãã¹ãã絶察URLãäœæããããã«äœ¿çšãããçŸåšã®äœæ¥ãã£ã¬ã¯ããªã«é¢ä¿ãªãèšå®ãã¡ã€ã«ãæ£ããèªã¿èŸŒãŸããããšãä¿èšŒããŸãã
import.metaã«ããç°å¢æ€åº
\n\nimport.meta.urlã¯åºããµããŒããããŠããŸãããimport.metaã§å©çšã§ããããããã£ã¯ç°å¢ã«ãã£ãŠå€§ããç°ãªãå ŽåããããŸãããããã®ããããã£ã調ã¹ãããšã§ãã©ã³ã¿ã€ã ã³ã³ããã¹ããæ€åºããããã«å¿ããŠã³ãŒããé©å¿ãããããšãã§ããŸãã
ãã©ãŠã¶ç°å¢
\n\nãã©ãŠã¶ç°å¢ã§ã¯ãimport.meta.urlã«ã¯éåžžãã¢ãžã¥ãŒã«ã®å®å
šãªURLãå«ãŸããŸãããã©ãŠã¶ã¯éåžžãããã©ã«ãã§ã¯import.metaã®ä»ã®ããããã£ãå
¬éããŸããããäžéšã®å®éšçãªæ©èœããã©ãŠã¶æ¡åŒµæ©èœãã«ã¹ã¿ã ããããã£ã远å ããå ŽåããããŸãã
\n// Browser environment\nconsole.log('Module URL:', import.meta.url);\n\n// Attempt to access a non-standard property (may result in undefined)\nconsole.log('Custom Property:', import.meta.customProperty);\n
Node.jsç°å¢
\n\nNode.jsã§ã¯ãESMïŒECMAScript ModulesïŒã䜿çšããå Žåãimport.meta.urlã«ã¯ãã¡ã€ã«ã·ã¹ãã äžã®ã¢ãžã¥ãŒã«ã®å Žæã衚ãfile:// URLãå«ãŸããŸããNode.jsã¯ãimport.meta.resolveãªã©ã®ä»ã®ããããã£ãæäŸããŠãããããã¯çŸåšã®ã¢ãžã¥ãŒã«ã«å¯ŸããŠã¢ãžã¥ãŒã«æå®åã解決ããŸãã
\n// Node.js environment (ESM)\nconsole.log('Module URL:', import.meta.url);\nconsole.log('Module Resolve:', import.meta.resolve('./another-module.js')); // Resolves the path to another-module.js\n
Denoç°å¢
\n\nJavaScriptããã³TypeScriptã®ã¢ãã³ãªã©ã³ã¿ã€ã ã§ããDenoããimport.metaããµããŒãããŠããŸããNode.jsãšåæ§ã«ãimport.meta.urlã¯ã¢ãžã¥ãŒã«ã®URLãæäŸããŸããDenoã¯å°æ¥çã«ãimport.metaã«ç°å¢åºæã®è¿œå ããããã£ãå
¬éããå¯èœæ§ããããŸãã
ã©ã³ã¿ã€ã ã®æ€åº
\n\nimport.metaã§å©çšå¯èœãªããããã£ã®ãã§ãã¯ããä»ã®ç°å¢æ€åºææ³ïŒäŸïŒwindowãŸãã¯processã®ååšãã§ãã¯ïŒãšçµã¿åãããããšã§ãã©ã³ã¿ã€ã ã³ã³ããã¹ãã確å®ã«å€æã§ããŸãã
\nfunction getRuntime() {\n if (typeof window !== 'undefined') {\n return 'browser';\n } else if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n return 'node';\n } else if (typeof Deno !== 'undefined') {\n return 'deno';\n } else {\n return 'unknown';\n }\n}\n\nfunction detectEnvironment() {\n const runtime = getRuntime();\n\n if (runtime === 'browser') {\n console.log('Running in a browser environment.');\n } else if (runtime === 'node') {\n console.log('Running in a Node.js environment.');\n } else if (runtime === 'deno') {\n console.log('Running in a Deno environment.');\n } else {\n console.log('Running in an unknown environment.');\n }\n\n console.log('import.meta.url:', import.meta.url);\n\n try {\n console.log('import.meta.resolve:', import.meta.resolve('./another-module.js'));\n } catch (error) {\n console.log('import.meta.resolve not supported in this environment.');\n }\n}\n\ndetectEnvironment();\n
ãã®ã³ãŒãã¹ããããã¯ããŸãæ©èœæ€åºïŒ`typeof window`ã`typeof process`ã`typeof Deno`ïŒã䜿çšããŠã©ã³ã¿ã€ã ãèå¥ããŸããæ¬¡ã«ãimport.meta.urlãšimport.meta.resolveãžã®ã¢ã¯ã»ã¹ã詊ã¿ãŸããimport.meta.resolveãå©çšã§ããªãå Žåãtry...catchãããã¯ããšã©ãŒãé©åã«åŠçãããã®ç°å¢ããã®ããããã£ããµããŒãããŠããªãããšã瀺ããŸãã
ã©ã³ã¿ã€ã ã³ã³ããã¹ãã«åºã¥ãåçèšå®
\n\nã©ã³ã¿ã€ã ç°å¢ãèå¥ãããããã®æ å ±ã䜿çšããŠããã®ç°å¢åºæã®æ§æãããªãã£ã«ããŸãã¯ã¢ãžã¥ãŒã«ãåçã«ããŒãã§ããŸããããã¯ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã§åäœããã¢ã€ãœã¢ãŒãã£ãã¯ãŸãã¯ãŠãããŒãµã«JavaScriptã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã
\n\näŸïŒç°å¢åºæã®èšå®ã®èªã¿èŸŒã¿
\n\n
\n// config-loader.js\nasync function loadConfig() {\n let configURL;\n\n if (typeof window !== 'undefined') {\n // Browser environment\n configURL = './config/browser.json';\n } else if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n // Node.js environment\n configURL = './config/node.json';\n } else {\n // Default configuration\n configURL = './config/default.json';\n }\n\n const absoluteConfigURL = new URL(configURL, import.meta.url);\n const response = await fetch(absoluteConfigURL);\n const config = await response.json();\n return config;\n}\n\nloadConfig().then(config => {\n console.log('Loaded configuration:', config);\n});\n
ãã®äŸã¯ãæ€åºãããã©ã³ã¿ã€ã ç°å¢ã«åºã¥ããŠç°ãªãèšå®ãã¡ã€ã«ãèªã¿èŸŒãæ¹æ³ã瀺ããŠããŸããç°å¢ãç¹å®ããããã«windowïŒãã©ãŠã¶ïŒãšprocessïŒNode.jsïŒã®ååšããã§ãã¯ãã察å¿ããèšå®ãã¡ã€ã«ãããŒãããŸããç°å¢ãç¹å®ã§ããªãå Žåã¯ãããã©ã«ãã®èšå®ãããŒããããŸããURLã³ã³ã¹ãã©ã¯ã¿ã¯ãã¢ãžã¥ãŒã«ã®import.meta.urlãèµ·ç¹ãšããŠãèšå®ãã¡ã€ã«ãžã®çµ¶å¯ŸURLãäœæããããã«å床䜿çšãããŸãã
äŸïŒæ¡ä»¶ä»ãã¢ãžã¥ãŒã«ããŒã
\n\nã©ã³ã¿ã€ã ç°å¢ã«ãã£ãŠã¯ãç°ãªãã¢ãžã¥ãŒã«ãããŒãããå¿ èŠãããå ŽåããããŸãããããå®çŸããããã«ãç°å¢æ€åºãšçµã¿åãããŠåçã€ã³ããŒãïŒ`import()`ïŒã䜿çšã§ããŸãã
\n\n
\n// module-loader.js\nasync function loadEnvironmentSpecificModule() {\n let modulePath;\n\n if (typeof window !== 'undefined') {\n // Browser environment\n modulePath = './browser-module.js';\n } else if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n // Node.js environment\n modulePath = './node-module.js';\n } else {\n console.log('Unsupported environment.');\n return;\n }\n\n const absoluteModulePath = new URL(modulePath, import.meta.url).href;\n const module = await import(absoluteModulePath);\n module.default(); // Assuming the module exports a default function\n}\n\nloadEnvironmentSpecificModule();\n
ãã®äŸã§ã¯ãã©ã³ã¿ã€ã ç°å¢ã«åºã¥ããŠbrowser-module.jsãŸãã¯node-module.jsã®ãããããåçã«ã€ã³ããŒããããŸããimport()颿°ã¯ãã¢ãžã¥ãŒã«ãªããžã§ã¯ãã§è§£æ±ºãããPromiseãè¿ãããã®ãšã¯ã¹ããŒãã«ã¢ã¯ã»ã¹ã§ããããã«ããŸããåçã€ã³ããŒãã䜿çšããåã«ããã©ãŠã¶ã®ãµããŒããèæ
®ããŠãã ãããå€ããã©ãŠã¶ã«ã¯ããªãã£ã«ãå«ããå¿
èŠããããããããŸããã
èæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
\n\n- \n
- ãŠãŒã¶ãŒãšãŒãžã§ã³ãæ€åºãããæ©èœæ€åºãåªå ïŒã©ã³ã¿ã€ã ç°å¢ã倿ããããã«ããŠãŒã¶ãŒãšãŒãžã§ã³ãæååã§ã¯ãªããæ©èœæ€åºïŒç¹å®ã®ããããã£ã颿°ã®ååšããã§ãã¯ããããšïŒã«äŸåããŠãã ããããŠãŒã¶ãŒãšãŒãžã§ã³ãæååã¯ä¿¡é Œæ§ãäœãã容æã«åœè£ ãããå¯èœæ§ããããŸãã \n
- ã°ã¬ãŒã¹ãã«ãã°ã©ããŒã·ã§ã³ïŒæç€ºçã«ãµããŒããããŠããªãç°å¢ã«å¯ŸããŠã¯ããã©ãŒã«ããã¯ã¡ã«ããºã ãããã©ã«ãèšå®ãæäŸããŠãã ãããããã«ãããäºæããªãã©ã³ã¿ã€ã ã³ã³ããã¹ãã§ãã¢ããªã±ãŒã·ã§ã³ãæ©èœãç¶ããããšãä¿èšŒããŸãã \n
- ã»ãã¥ãªãã£ïŒç°å¢æ€åºã«åºã¥ããŠå€éšãªãœãŒã¹ãããŒããããã³ãŒããå®è¡ãããããéã«ã¯æ³šæãå¿ èŠã§ããç¹ã«ã¢ããªã±ãŒã·ã§ã³ããŠãŒã¶ãŒããæäŸãããããŒã¿ãæ±ãå Žåã¯ãã»ãã¥ãªãã£ã®è匱æ§ãé²ãããã«ãå ¥åãæ€èšŒãããŒã¿ããµãã¿ã€ãºããŠãã ããã \n
- ãã¹ãïŒç°å¢æ€åºããžãã¯ãæ£ç¢ºã§ãããã³ãŒããæåŸ éãã«åäœããããšã確èªããããã«ãç°ãªãã©ã³ã¿ã€ã ç°å¢ã§ã¢ããªã±ãŒã·ã§ã³ã培åºçã«ãã¹ãããŠãã ãããè€æ°ã®ç°å¢ã§ã®ãã¹ãå®è¡ããµããŒããããã¹ããã¬ãŒã ã¯ãŒã¯ïŒäŸïŒJestãMochaïŒã䜿çšããŠãã ããã \n
- ããªãã£ã«ãšãã©ã³ã¹ãã€ã©ïŒå€ããã©ãŠã¶ãã©ã³ã¿ã€ã ç°å¢ãšã®äºææ§ã確ä¿ããããã«ãããªãã£ã«ãšãã©ã³ã¹ãã€ã©ã®äœ¿çšãæ€èšããŠãã ãããBabelãWebpackã¯ãã³ãŒããå€ãECMAScriptããŒãžã§ã³ã«ãã©ã³ã¹ãã€ã«ããå¿ èŠãªããªãã£ã«ãå«ããã®ã«åœ¹ç«ã¡ãŸãã \n
- ç°å¢å€æ°ïŒãµãŒããŒãµã€ãã¢ããªã±ãŒã·ã§ã³ã®å Žåãã¢ããªã±ãŒã·ã§ã³ã®åäœãèšå®ããããã«ç°å¢å€æ°ã®äœ¿çšãæ€èšããŠãã ãããããã«ãããã³ãŒããçŽæ¥å€æŽããããšãªããã¢ããªã±ãŒã·ã§ã³ã®èšå®ãç°¡åã«ã«ã¹ã¿ãã€ãºã§ããŸããNode.jsã®
dotenvã®ãããªã©ã€ãã©ãªã¯ãç°å¢å€æ°ã®ç®¡çã«åœ¹ç«ã¡ãŸãã \n
ãã©ãŠã¶ãšNode.jsãè¶
ããŠïŒimport.metaã®æ¡åŒµ
\n\nimport.metaã¯æšæºåãããŠããŸããããããå
¬éããããããã£ã¯æçµçã«ãã¹ãç°å¢ã«äŸåããŸããããã«ãããçµã¿èŸŒã¿ç°å¢ã¯ã¢ããªã±ãŒã·ã§ã³ããŒãžã§ã³ãäžæã®èå¥åããã©ãããã©ãŒã åºæã®èšå®ãªã©ã®ã«ã¹ã¿ã æ
å ±ã§import.metaãæ¡åŒµã§ããŸããããã¯ããã©ãŠã¶ãNode.jsã©ã³ã¿ã€ã ã§ã¯ãªãJavaScriptã³ãŒããå®è¡ããç°å¢ã«ãšã£ãŠéåžžã«åŒ·åã§ãã
çµè«
\n\nimport.metaãªããžã§ã¯ãã¯ãJavaScriptã§ã¢ãžã¥ãŒã«ã¡ã¿ããŒã¿ã«ã¢ã¯ã»ã¹ããããã®æšæºåãããä¿¡é Œæ§ã®é«ãæ¹æ³ãæäŸããŸããimport.metaã§å©çšå¯èœãªããããã£ã調ã¹ãããšã§ãã©ã³ã¿ã€ã ç°å¢ãæ€åºããããã«å¿ããŠã³ãŒããé©å¿ãããããšãã§ããŸããããã«ããã倿§ãªãã©ãããã©ãŒã ã§ã·ãŒã ã¬ã¹ã«åäœãããããããŒã¿ãã«ã§é©å¿æ§ã®é«ãå
ç¢ãªJavaScriptã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸããimport.metaãçè§£ãæŽ»çšããããšã¯ãç¹ã«è€æ°ã®ç°å¢ã察象ãšããã¢ã€ãœã¢ãŒãã£ãã¯ãŸãã¯ãŠãããŒãµã«ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããéã®çŸä»£ã®JavaScriptéçºã«ãšã£ãŠäžå¯æ¬ ã§ããJavaScriptãé²åããæ°ãããã¡ã€ã³ã«æ¡å€§ãç¶ããã«ã€ããŠãimport.metaã¯ã©ã³ã¿ã€ã ã³ã³ããã¹ãåæãšåçæ§æã«ãããŠãŸããŸãéèŠãªåœ¹å²ãæããã§ãããããã€ãã®ããã«ãã䜿çšã®JavaScriptã©ã³ã¿ã€ã ç°å¢ã«åºæã®ããã¥ã¡ã³ããåç
§ããŠãimport.metaã§å©çšå¯èœãªããããã£ãšãããã®äœ¿ç𿹿³ãçè§£ããŠãã ããã